package object3;


/**
 * 类方法注意事项
 */
public class StaticMethodDetail {

    public static void main(String[] args) {

        /*
            1)类方法和普通方法都是随着类的加载而加载，将结构信息存在方法区
              类方法中无this的参数
              普通方法中隐含着this的参数
            2)类方法可以通过类名调用，也可以通过对象名调用
            3)普通方法和对象有关，需要通过对象名调用，比如 对象名.方法名(参数)，不能通过类名调用
            4)类方法中不允许使用和对象有关的关键字，比如this和super。普通方法可以
            5)类方法(静态方法)中只能访问静态变量或静态方法
            6)普通成员方法既可以访问非静态成员，也可以访问静态成员
         */
        D.hi();

        //非静态方法，不能通过类名调用
//        D.say();
        new D().say();//可以
    }
}

class D {

    private int n1 = 100;

    private static int n2 = 200;

    public void say() { //非静态方法

    }

    public static void hi() {//类方法
        //类方法中不允许使用和对象有关的关键字
        //比如 this 和 super。普通方法（成员方法）可以
        //System.out.println(this.n1);
    }

    //静态方法只能访问静态成员
    public static void hello() {

        System.out.println(n2);

        System.out.println(D.n2);

//        System.out.println(this.n2); 不能使用

        hi();//ok

        //say();//错误
    }

    public void ok() {

        //非静态成员
        System.out.println(n1);
        say();

        //静态成员
        System.out.println(n2);
        hello();
    }
}